// https://leetcode.cn/problems/minimum-size-subarray-sum/

// 题干：给定一个含有 n 个正整数的数组和一个正整数 target 。
//       找出该数组中满足其总和大于等于target的长度最小的连续子数组
//       并返回其长度。如果不存在符合条件的子数组，返回 0 。

// 示例：输入：target = 7, nums = [2,3,1,2,4,3]
//       输出：2

// 碎语：滑动窗口题，该清楚循环的条件，什么时候入窗口，出窗口，怎么出窗口，什么时候更新结果
//       什么时候退出循环

#include <bits/stdc++.h>
using namespace std;

class Solution
{
public:
    int minSubArrayLen(vector<int>& nums, int target)
    {
        int ret = INT_MAX, sum = 0; // 用于后续更新和记录

        for (int left = 0, right = 0 ; right < nums.size() ; right++){
            sum += nums[right]; // 入窗口
            while (sum >= target){
                ret = min(ret, right - left + 1);
                sum -= nums[left++]; // 出窗口
            }
        }

        return ret == INT_MAX ? 0 : ret;
    }
};

int main()
{
    Solution sol;
    vector<int> nums = {2,3,1,2,4,3};

    cout << sol.minSubArrayLen(nums, 7);
    cout << endl;

    return 0;
}